﻿using System;
using System.Collections.Generic;
using System.Text;
using Ord;

namespace OrdonnanceAI
{
    static class BotFirst
    {
        static Random rnd = new Random((int)DateTime.Now.Ticks);

        // AInum = 0
        // находится сила каждой карты в руке
        // если все города пусты, выкладывается самая сильная карта в любой город
        // смотрится, насколько каждая карта подходит к каждому непустому городу
        // если имеются пустые города и нет достаточно подходящей карты для уже заполненых, выкладывается самая сильная карта в пустой город
        // иначе кладется самая подходящая карта для самого подходящего города
        // достаточно подходящая карта для города - это карта, у которой совпадают сразу 2 отряда с ведущими армиями города
        // ведущая армия - это армия которая есть в каждой карте в проверяемом городе. То есть есть возможность выложить четверку по этой армии
        public static CardPoint PlayCard(Town[] town, List<Card> card)
        {
            CardPoint p = new CardPoint(-1, -1);

            #region *** рассчитаем силу каждой карты **********
            // уровень каждого войска: копейщики - 10, лучники - 11, мечники - 12....
            int[] sCard = new int[5];
            int numMaxCard = 0; // номер самой сильной карты
            int max = 0;
            for (int c = 0; c < card.Count; c++)
            {
                sCard[c] = 0;
                for (int tr = 0; tr < 5; tr++)
                {
                    if (card[c].troop[tr]) sCard[c] += 10 + tr;
                }
                // смотрим самую сильную карту
                if (sCard[c] > max)
                {
                    max = sCard[c];
                    numMaxCard = c;
                }
            }
            #endregion *** рассчитаем силу каждой карты **********

            #region *** eсли ВСЕ города пусты, выкладываем в любой самую сильную карту ***
            bool bEmpty = true; // пусты все города
            bool bEmptyOne = false; // пуст хотябы 1 город
            for (int t = 0; t < 5; t++)
            {
                if (town[t].card.Count > 0)
                    bEmpty = false;
                if (town[t].card.Count == 0)
                    bEmptyOne = true;
            }

            if (bEmpty)
            {
                p.NumTown = rnd.Next(5);
                p.NumCardInHand = numMaxCard;
                return p;
            }

            #endregion *** eсли ВСЕ города пусты, выкладываем в любой самую сильную карту ***

            #region *** смотрим каждую карту. Насколько она подходит каждому городу ******
            // 0 - не подходит, 10 - дополняет ведущую армию копейщиков, 11 - доп вед арм лучников. если доп 2 вед армии, складываем
            // i - город, j - карта
            int[,] MapCard = new int[5, card.Count];
            // пробегаемся по всем городам
            for (int t = 0; t < 5; t++)
            {
                // смотрим ведущие армии
                bool[] TopArm = new bool[5];
                for (int tr = 0; tr < 5; tr++)
                {
                    TopArm[tr] = true;
                    // пробегаемся по всем картам в городе
                    // если хотя бы в одной карте нет нужной армии, значит армия не ведущая
                    for (int c = 0; c < town[t].card.Count; c++)
                    {
                        if (!town[t].card[c].troop[tr])
                        {
                            TopArm[tr] = false;
                            break;
                        }
                    }
                }

                // смотрим, насколько подходит каждая карта в руке к этому городу
                for (int c = 0; c < card.Count; c++)
                {
                    MapCard[t, c] = 0;
                    // пробегаемся по всем армиям карты. Если армия совпадает с вед армией города, добавляем коэф
                    for (int tr = 0; tr < 5; tr++)
                    {
                        if (card[c].troop[tr] && TopArm[tr]) MapCard[t, c] += 10 + tr;
                    }
                }
            }
            #endregion ***  смотрим каждую карту. Насколько она подходит каждому городу ******

            #region *** смотрим наиболее подходящую карту для выкладывания ***
            max = -1;
            for (int t = 0; t < 5; t++)
            {
                // если город заполнен, переходим к следующему
                if (town[t].card.Count >= 4) continue;
                // пробегаемся по всем картам в руке
                for (int c = 0; c < card.Count; c++)
                {
                    if (max < MapCard[t, c])
                    {
                        max = MapCard[t, c];
                        p.NumTown = t;
                        p.NumCardInHand = c;
                    }
                }
            }
            #endregion *** смотрим наиболее подходящую карту для выкладывания ***

            // если есть пустые города смотрим:
            // если карта достаточно подходит, выкладываем ее в уже заявленый город
            // иначе заполняем пустой город самой сильной картой
            if (bEmptyOne && max < 20)
            {
                // находим случайный пустой город
                int n = 0;
                while (true)
                {
                    n = rnd.Next(5);
                    if (town[n].card.Count == 0) break;
                }
                p.NumTown = n;
                // выкладываем в него самую сильную карту
                p.NumCardInHand = numMaxCard;
            }
            return p;
        }

    }
}
